package util;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author xiongyx
 * @date 2020/5/7
 */
public class AncReflectUtil {

    /**
     * 获得一个类的所有Field(包括继承的所有父类)
     * */
    public static List<Field> getAllFields(Class clazz){
        List<Field> fieldList = new ArrayList<>();

        collectAllFields(clazz,fieldList);

        return fieldList;
    }

    /**
     * 获得一个类的所有Field(包括继承的所有父类)
     * */
    public static List<Field> getAllNonStaticFields(Class clazz){
        List<Field> fieldList = new ArrayList<>();

        collectAllFields(clazz,fieldList);

        // 排除掉static静态的属性
        return fieldList.stream().filter(item-> !Modifier.isStatic(item.getModifiers())).collect(Collectors.toList());
    }

    // ======================================私有方法==========================================

    private static void collectAllFields(Class clazz,List<Field> collector){
        if(clazz == null){
            // 向上遍历父类，抵达了顶层object类，直接返回
            return;
        }

        collector.addAll(Arrays.asList(clazz.getDeclaredFields()));

        // 递归向上收集父类Field
        collectAllFields(clazz.getSuperclass(),collector);
    }

}
